<?php
//递归删除目录
function delDir($directory)
{
    //判断目录是否存在，如果不存在rmdir()函数会出错
    if (file_exists($directory)) {
        //打开目录返回目录资源，并判断是否成功
        if ($dir_handle = @opendir($directory)) {
            //遍历目录，读出目录中的文件或文件夹
            while ($filename = readdir($dir_handle)) {
                //一定要排除两个特殊的目录
                if ($filename != "." && $filename != "..") {
                    //将目录下的文件和当前目录相连
                    $subFile = $directory . "/" . $filename;
                    //如果是目录条件则成立
                    if (is_dir($subFile)) {
                        //递归调用自己删除子目录
                        delDir($subFile);
                    }
                    //如果是文件条件则成立
                    if (is_file($subFile)) {
                        //直接删除这个文件
                        unlink($subFile);
                    }
                }
            }
            //关闭目录资源
            closedir($dir_handle);
            //删除空目录
            rmdir($directory);
        }
    }
}


//递归排序
function tree($array, $parent_id = 0, $level = 0)
{
    static $data = array();
    foreach ($array as $k => $v) {
        if ($v['parent_id'] == $parent_id) {
            $v['level'] = $level;
            $data[] = $v;
            unset($array[$k]);
            tree($array, $v['id'], $level + 1);
        }
    }
    return $data;
}

//生成导航链接
function make_url(&$category)
{
    switch ($category['type']) {
        case '1':
            $category['link'] = U('category', array('id' => $category['id']));
            break;
        case '2':
            $category['link'] = U('lst', array('id' => $category['id']));
            break;
        case '3':
            $category['link'] = $category['url'];
    }
}

function children(&$category)
{
    foreach ($category as $key => &$value) {
        $value['child'] = M("Category")->where("parent_id='$value[id]'")->select();
        make_url($value);
        children($value['child']);
    }
}


//截取字符串
//使用方式{{$v.title|msubstr=0,5}}
function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
{
    if (function_exists("mb_substr")) {
        $slice = mb_substr($str, $start, $length, $charset);
    } elseif (function_exists('iconv_substr')) {
        $slice = iconv_substr($str, $start, $length, $charset);
    } else {
        $re['utf-8'] = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
        $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
        $re['gbk'] = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
        $re['big5'] = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("", array_slice($match[0], $start, $length));
    }
    $fix = '';
    if (strlen($slice) < strlen($str)) {
        $fix = '......';
    }
    return $suffix ? $slice . $fix : $slice;
}


//自定义遍历目录函数，显示目录的名称、类型、大小、是否为图片、创建时间和修改时间
function dir_info($path)
{
    $result = [];
    $handle = opendir($path);
    while ($file = readdir($handle)) {
        $array = [];
        if (substr($file, 0, 1) == ".") {
            continue;
        }
        $array["name"] = $file;

        $array["type"] = filetype($path . "/" . $file);

        $array["is_img"] = getimagesize($path . "/" . $file) ? 1 : 0;

        if ($array["type"] == 'dir') {
            //dir_size为自定义的计算目录文件大小
            $array["size"] = dir_size($path . "/" . $file);
        } else
            $array["size"] = filesize($path . "/" . $file);

        $array["ctime"] = date('Y-m-d', filectime($path . "/" . $file));
        $array["mtime"] = date('Y-m-d', filemtime($path . "/" . $file));

        $result[] = $array;
    }
    closedir($handle);
    return $result;
}


//声明一个函数用来返回文件的类型
function get_file_type($filetype)
{
    $type = "";
    //通过filetype()函数返回的文件类型做为选择的条件
    switch ($filetype) {
        case 'file':
            $type .= "普通文件";
            break;
        case 'dir':
            $type .= "目录文件";
            break;
        case 'block':
            $type .= "块设备文件";
            break;
        case 'char':
            $type .= "字符设备文件";
            break;
        case 'fifo':
            $type .= "命名管道文件";
            break;
        case 'link':
            $type .= "符号链接";
            break;
        case 'unknown':
            $type .= "末知类型";
            break;
        default:
            $type .= "没有检测到类型";
    }
    //返回转换后的类型
    return $type;
}


//自定义一个函数dir_size()，统计传入参数的目录大小
function dir_size($directory)
{
    //整型变量初值为0，用来累加各个文件大小从而计算目录大小
    $dir_size = 0;
    //打开目录，并判断是否能成功打开
    if ($dir_handle = @opendir($directory)) {
        //循环遍历目录下的所有文件
        while ($filename = readdir($dir_handle)) {
            //一定要排除两个特殊的目录
            if ($filename != "." && $filename != "..") {
                //将目录下的子文件和当前目录相连
                $subFile = $directory . "/" . $filename;
                //如果为目录
                if (is_dir($subFile))
                    //递归地调用自身函数，求子目录的大小
                    $dir_size += dir_size($subFile);
                //如果是文件
                if (is_file($subFile))
                    //求出文件的大小并累加
                    $dir_size += filesize($subFile);
            }
        }
        //关闭文件资源
        closedir($dir_handle);
        //返回计算后的目录大小
        return $dir_size;
    }
}


//自定义一个文件大小单位转换函数
function get_file_size($bytes)
{
    //如果提供的字节数大于等于2的40次方，则条件成立
    if ($bytes >= pow(2, 40)) {
        //将字节大小转换为同等的T大小
        $return = round($bytes / pow(1024, 4), 2);
        //单位为TB
        $suffix = "TB";
        //如果提供的字节数大于等于2的30次方，则条件成立
    } elseif ($bytes >= pow(2, 30)) {
        //将字节大小转换为同等的G大小
        $return = round($bytes / pow(1024, 3), 2);
        //单位为GB
        $suffix = "GB";
        //如果提供的字节数大于等于2的20次方，则条件成立
    } elseif ($bytes >= pow(2, 20)) {
        //将字节大小转换为同等的M大小
        $return = round($bytes / pow(1024, 2), 2);
        //单位为MB
        $suffix = "MB";
        //如果提供的字节数大于等于2的10次方，则条件成立
    } elseif ($bytes >= pow(2, 10)) {
        //将字节大小转换为同等的K大小
        $return = round($bytes / pow(1024, 1), 2);
        //单位为KB
        $suffix = "KB";
        //否则提供的字节数小于2的10次方，则条件成立
    } else {
        //字节大小单位不变
        $return = $bytes;
        //单位为Byte
        $suffix = "Byte";
    }
    //返回合适的文件大小和单位
    return $return . " " . $suffix;
}


//自定义函数递归的删除整个目录
function rm_dir($directory)
{
    //判断目录是否存在，如果不存在rmdir()函数会出错
    if (file_exists($directory)) {
        //打开目录返回目录资源，并判断是否成功
        if ($dir_handle = @opendir($directory)) {
            //遍历目录，读出目录中的文件或文件夹
            while ($filename = readdir($dir_handle)) {
                //一定要排除两个特殊的目录
                if ($filename != "." && $filename != "..") {
                    //将目录下的文件和当前目录相连
                    $sub_file = $directory . "/" . $filename;
                    //如果是目录条件则成立
                    if (is_dir($sub_file)) {
                        //递归调用自己删除子目录
                        rm_dir($sub_file);
                    }
                    //如果是文件条件则成立
                    if (is_file($sub_file)) {
                        //直接删除这个文件
                        unlink($sub_file);
                    }
                }
            }
            //关闭目录资源
            closedir($dir_handle);
            //删除空目录
            rmdir($directory);
        }
    }
}

//自定义上传文件函数
function uploadfile($file, $path)
{
    if (isset($file['file']['name'])) {
        //假如有错误直接返回false
        foreach ($file['file']['error'] as $k => $v) {
            if ($v > 0) {
                echo '上传错误: ';
                switch ($v) {
                    case 1:
                        echo '上传文件大小超出了PHP配置文件中的约定值：upload_max_filesize';
                        break;
                    case 2:
                        echo '上传文件大小超出了表单中的约定值：MAX_FILE_SIZE';
                        break;
                    case 3:
                        echo '文件只被部分上载';
                        break;
                    case 4:
                        echo '没有上传文件';
                        break;
                }
                echo $file['file']['name'][$k];
                return false;
            }
        }
        foreach ($file['file']['name'] as $k => $v) {
            //截取文件后缀名
            $extension = strrchr($file['file']['name'][$k], '.');
            //定义上传后的位置和新文件名
            //$dir = $path .'/'. date('Y_m_d', time());
            if (!is_dir($path)) {
                //递归建立目录
                mkdir($path, 0777, true);
            }
            $upfile = $path . '/' . date('Y_m_d', time()) . '_' . rand(100000, 999999) . $extension;
            //判断是否为上传文件
            if (is_uploaded_file($file['file']['tmp_name'][$k])) {
                //从移动文件
                if (!move_uploaded_file($file['file']['tmp_name'][$k], $upfile)) {
                    echo '问题: 不能将文件移动到指定目录。';
                    exit;
                }
            } else {
                echo '问题: 上传文件不是一个合法文件: ';
                echo $file['file']['name'][$k];
                exit;
            }
            //如果文件上传成功则输出
            echo '文件' . $upfile . '上传成功,大小为' . $file['file']['size'][$k] . '！<br>';
        }
        return true;
    } else {
        echo '上传文件为空！';
        return false;
    }
}


//自定义遍历目录下的所有文件夹和文件函数
function dir_all($path)
{
    static $result = [];
    if (!in_array($path, $result)) {
        $result[] = $path;
    }
    $handle = opendir($path);
    while ($file = readdir($handle)) {
        if (substr($file, 0, 1) == ".") {
            continue;
        }
        $result[] = $path . "/" . $file;
        dir_all($path . "/" . $file);
    }
    closedir($handle);
    return $result;
}


//自定义函数递归的复制带有多级子目录的目录
function copy_dir($dir_src, $dir_to)
{
    //如果目标不是一个目录，是一个已存在的文件则退出
    if (is_file($dir_to)) {
        echo "目标不是目录不能创建!!";
        //退出函数
        return;
    }
    //如果目标目录不存在则创建，存在则不变
    if (!file_exists($dir_to)) {
        //创建目录目录
        mkdir($dir_to);
    }
    //打开目录返回目录资源，并判断是否成功
    if ($handle = @opendir($dir_src)) {
        //遍历目录，读出目录中的文件或文件夹
        while ($filename = readdir($handle)) {
            //一定要排除两个特殊的目录
            if ($filename != "." && $filename != "..") {
                //将源目录的多级子目录连接
                $sub_src_file = $dir_src . "/" . $filename;
                //将目标目录的多级子目录连接
                $sub_to_file = $dir_to . "/" . $filename;
                //如果源文件是一个目录
                if (is_dir($sub_src_file)) {
                    //递归调用自己复制子目录
                    copy_dir($sub_src_file, $sub_to_file);
                }
                //如果源文件是一个普通文件
                if (is_file($sub_src_file)) {
                    //直接复制到目标位置
                    copy($sub_src_file, $sub_to_file);
                }
            }
        }
        closedir($handle);       //关闭目录资源
    }
}


//自定义的dump调试函数
function p($array)
{
    dump($array, 1, '<pre>', 0);
}